package hy.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class Util {
    @Autowired
    private StringRedisTemplate redisTemplate;
 
    /**
     * 存入 Redis 的 Token 键的前缀
     */
    public static final String TOKEN_PREFIX = "idempotent:";
    /**
     * 创建 Token 存入 Redis，并返回该 Token
     * @return 生成的 Token 串
     */
    public String generateToken() {
        // 实例化生成 ID 工具对象
        String token = UUID.randomUUID().toString();
        // 设置存入 Redis 的 Key
        String key = TOKEN_PREFIX + token;
        // 存储 Token 到 Redis，且设置过期时间为5分钟
        redisTemplate.opsForValue().set(key, "0", 5, TimeUnit.MINUTES);
        // 返回 Token
        return token;
    }
 
    /**
     * 验证 Token 正确性
     * @param token token 字符串
     * @return 验证结果
     */
    public boolean validToken(String token) {
        // 设置 Lua 脚本，其中 KEYS[1] 是 key，KEYS[2] 是 0,KEYS[3] 是 1
        String script = "if redis.call('get', KEYS[1]) == KEYS[2] then redis.call('set', KEYS[1],KEYS[3]) return 1 else return 0 end";
        RedisScript<Long> redisScript = new DefaultRedisScript<>(script, Long.class);
        // 根据 Key 前缀拼接 Key
        String key = TOKEN_PREFIX + token;
        // 执行 Lua 脚本
        Long result = redisTemplate.execute(redisScript, Arrays.asList(key, "0","1"));
        // 根据返回结果判断是否成功成功匹配并删除 Redis 键值对，若果结果不为空和0，则验证通过
       return result==1;
    } 
}